package com.rykj.util;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 日期公共函数
 * @author shenjunjie
 * @version [s001, 2010-11-19]
 * <p>
 * <p>
 * <p>
 * public static final int DAY_OF_WEEK_IN_MONTHget 和 set 的字段数字，指示当前月中的第几个星期。
 * <p>
 * 与 DAY_OF_WEEK 字段一起使用时，就可以唯一地指定某月中的某一天。
 * <p>
 * 与 WEEK_OF_MONTH 和 WEEK_OF_YEAR 不同，
 * <p>
 * 该字段的值并不 取决于 getFirstDayOfWeek() 或 getMinimalDaysInFirstWeek()。
 * <p>
 * DAY_OF_MONTH 1 到 7 总是对应于 DAY_OF_WEEK_IN_MONTH 1；8 到 14 总是对应于 DAY_OF_WEEK_IN_MONTH 2，
 * <p>
 * 依此类推。DAY_OF_WEEK_IN_MONTH 0 表示 DAY_OF_WEEK_IN_MONTH 1 之前的那个星期。
 * <p>
 * 负值是从一个月的末尾开始逆向计数，因此，一个月的最后一个星期天被指定为 DAY_OF_WEEK = SUNDAY,
 * <p>
 * DAY_OF_WEEK_IN_MONTH = -1。因为负值是逆向计数的，所以它们在月份中的对齐方式通常与正值的不同。
 * <p>
 * 例如，如果一个月有 31 天，那么 DAY_OF_WEEK_IN_MONTH -1 将与 DAY_OF_WEEK_IN_MONTH 5
 * <p>
 * 和 DAY_OF_WEEK_IN_MONTH 4 的末尾相重叠。
 */

public class DateUtil {

    private static List<Calendar> holidayList;

    private static boolean holidayFlag;

    public static int cluCountDay(String createTime, int applyDay) {
        Calendar instance = Calendar.getInstance();
        instance.setTime(new Date(StringUtil
                .getTimeFromFormatStr(createTime, "yyyy-MM-dd HH:mm:ss")));

        List<Calendar> list = DateUtil.addDateByWorkDay(instance, applyDay);
        Calendar currentDay = Calendar.getInstance();
        int j = 0;
        for (int i = 0; i < list.size(); i++) {
            if (currentDay.compareTo(list.get(i)) <= 0) {
                break;
            }
            j++;
        }
        int i = list.size() - j;
        System.out.println("i = " + i);
        return i;
    }


    /**
     * 计算工作日集合
     * <p>
     * 具体节日包含哪些,可以在HolidayMap中修改
     * @param src
     *         日期(源)
     * @param adddays
     *         要加的天数
     * @throws throws
     *         [违例类型] [违例说明]
     */
    public static List<Calendar> addDateByWorkDay(Calendar src, int adddays) {
//        Calendar code = null;
        List<Calendar> calendars = new ArrayList<>();
        holidayFlag = false;
        for (int i = 0; i < adddays; i++) {
            //把源日期加一天
            src.add(Calendar.DAY_OF_MONTH, 1);
            holidayFlag = checkHoliday(src);
            if (holidayFlag) {
                i--;
            } else {
                Calendar t = Calendar.getInstance();
                t.setTime(src.getTime());
                calendars.add(t);
            }
            System.out.println(src.getTime());
        }
        for (int i = 0; i < calendars.size(); i++) {
            System.out.println("Final Result:" + calendars.get(i).getTime());
        }
        return calendars;
    }


    /**
     * 校验指定的日期是否在节日列表中
     * <p>
     * 具体节日包含哪些,可以在HolidayMap中修改
     * @param src
     *         要校验的日期(源)
     */

    public static boolean checkHoliday(Calendar src) {
        boolean result = false;
        if (holidayList == null) {
            initHolidayList();
        }
        //先检查是否是周六周日(有些国家是周五周六)
        if (src.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || src
                .get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            return true;
        }
        for (Calendar c : holidayList) {
            if (src.get(Calendar.MONTH) == c.get(Calendar.MONTH) && src
                    .get(Calendar.DAY_OF_MONTH) == c.get(Calendar.DAY_OF_MONTH)) {
                result = true;
            }
        }
        return result;
    }


    /**
     * 初始化节日List,如果需要加入新的节日,请在这里添加
     * <p>
     * 加的时候请尽量使用Calendar自带的常量而不是魔鬼数字
     * <p>
     * 注:年份可以随便写,因为比的时候只比月份和天
     */

    private static void initHolidayList() {

        holidayList = new ArrayList();


        //五一劳动节

//        Calendar may1 = Calendar.getInstance();
//
//        may1.set(Calendar.MONTH, Calendar.MAY);
//
//        may1.set(Calendar.DAY_OF_MONTH, 1);
//
//        holidayList.add(may1);
//
//
//        Calendar may2 = Calendar.getInstance();
//
//        may2.set(Calendar.MONTH, Calendar.MAY);
//
//        may2.set(Calendar.DAY_OF_MONTH, 2);
//
//        holidayList.add(may2);
//
//
//        Calendar may3 = Calendar.getInstance();
//
//        may3.set(Calendar.MONTH, Calendar.MAY);
//
//        may3.set(Calendar.DAY_OF_MONTH, 3);
//
//        holidayList.add(may3);
//
//
//        Calendar h3 = Calendar.getInstance();
//
//        h3.set(2000, 1, 1);
//
//        holidayList.add(h3);
//
//
//        Calendar h4 = Calendar.getInstance();
//
//        h4.set(2000, 12, 25);
//
//        holidayList.add(h4);


        //中国母亲节：五月的第二个星期日

//        Calendar may5 = Calendar.getInstance();

        //设置月份为5月

//        may5.set(Calendar.MONTH, Calendar.MAY);

        //设置星期:第2个星期

//        may5.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2);

        //星期日

//        may5.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);

//        System.out.println(may5.getTime());


//        holidayList.add(may5);

    }

}